<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 定义对象 ： 
        // 1.字面量定义 
        // var obj = {name:"张三"};

        // 2.内置构造函数
        // var obj =  new Object({name:"张安"});
        // console.log(obj);

        // 3.自定义构造函数
        // function Person(){
        //     this.name = "张安";
        // }
        // var zhangan = new Person();
        // console.log(zhangan);

        // 4.工厂模式 

        // function Factory(){
        //     var obj = {}; // 创建一个原材料
        //     // 加工原材料
        //     obj.name = "张安";
        //     obj.age = 20;
        //     // 出厂
        //     return obj;
        // }
        // var obj = Factory();
        // console.log(obj);


        // 5.Object.create 可以被配置的对象 ；
        // 一、创建原型对象 ： Object.create(对象); 在对象的原型上创建内容
        // var obj = Object.create({name:"张三",age:20});
        // console.log(obj);
        // console.log(obj.name);

        // 二、直接创建一个对象 
        // 第二个参数 配置 对象的键名和键值；可控状态
        // var obj = Object.create(null,{
        //         name:{
        //             value:"张三",
        //             configurable:true,
        //             enumerable:true   // 可枚举
        //         },
        //         age:{
        //             configurable:true, // 不可被配置，不能被删除；
        //             value:20,
        //             enumerable:true
        //         }
        // })
        // console.log(obj);

        // 1.默认状态下删除 对象的属性；configurable 
        // 默认 这个对象是不可被配置的，也就是不能被删除属性
        // configurable:false 默认 ；
        // delete obj.age;
        // console.log(obj);

        // 2.是否可以被循环.默认是不能被循环的。
        // for(var key in obj){
        //     console.log(key);
        // }


        // 三 、通过存取器来创建对象

        var obj = Object.create(null,{
            name:{
                configurable:true,
                enumerable:true,
                get:function(){  // 取；
                    console.log("读取对象属性的时候执行这个get函数，返还值就是对象的键值");
                    return "张三";
                },
                // 设置内容 ，存；
                set:function(newvalue){
                    console.log("只要设置了内容 都会经过 set函数",newvalue);
                }
            },
            age:{
                configurable:true,
                enumerable:true,
                get:function(){
                    console.log("get age");
                    return 20;
                },
                set:function(newvalue){
                    console.log("只要设置age属性都会经过我，set函数，设置的值是",newvalue);
                }
            }
        })

        console.log(obj);
        // obj.name;  // 是一个get操作，获取这个name属性 ；
        // obj.name = "李四";  // 存 ，设置；



    </script>
</body>
</html>